package service

import (
	"chat_project/module"
	"chat_project/util"
	"errors"
	"fmt"
	"math/rand"
	"time"
)

/*
用于存储操作层接口,例如用户登录,用户注册等
*/

// 为了模块化设计,需要重新定义一个结构体
type UserService struct {
}

// 注册
func (s *UserService) Register(mobile, plainpwd, nickname, avatar, sex string) (user module.User, err error) {
	/*
		mobile:
		plainpwd:
		nickname:
		avatar:
		sex:
	*/
	fmt.Println("进入service.user.Register函数")
	// 1. 检测手机号是否存在,存在返回，不存在拼接数据插入数据库
	tmp := module.User{}
	fmt.Println("db查询手机号前")
	_, err = DBEngin.Where("mobile=?", mobile).Get(&tmp)
	if err != nil {
		fmt.Println(err.Error())
		return tmp, err
	}
	fmt.Println("db查询手机号后")
	// 1.1 检测手机号是否存在
	fmt.Println(tmp.Id)
	if tmp.Id > 0 {
		return tmp, errors.New("该手机号已经注册")
	}
	// 1.2 拼接数据
	tmp.Mobile = mobile
	tmp.Nickname = nickname
	tmp.Avatar = avatar
	// 随机字符串
	tmp.Salt = fmt.Sprintf("%06d", rand.Int31n(10000))
	tmp.Passwd = util.MakePasswd(plainpwd, tmp.Salt)
	tmp.Sex = sex
	tmp.Createat = time.Now()
	tmp.Token = fmt.Sprintf("%08d", rand.Int31())
	tmp.Online = 1
	tmp.Memo = ""
	// 2. 插入数据库
	_, err = DBEngin.InsertOne(&tmp)
	fmt.Println("注册数据成功")
	return tmp, err
}

// 登录
func (s *UserService) Login(mobile, plainpwd string) (user module.User, err error) {
	tmp := module.User{}
	// 1.根据查手机号查询用户
	_, err = DBEngin.Where("mobile=?", mobile).Get(&tmp)
	if err != nil {
		return tmp, err
	}
	// 处理没有查询到
	if tmp.Id == 0 {
		return tmp, errors.New("该用户不存在")
	}
	// 2. 比对密码
	if !util.ValidatePasswd(plainpwd, tmp.Salt, tmp.Passwd) {
		return tmp, errors.New("密码错误")
	}
	// 3. 刷新token
	str := fmt.Sprintf("%d", time.Now().Unix())
	token := util.MD5Encode(str)
	// 修改数据库中存储的token
	tmp.Token = token
	DBEngin.Id(tmp.Id).Cols("token").Update(&tmp)
	return tmp, nil
}
